<?php
namespace app\index\controller\decorator;
use think\Db;
/**
 * 谭
 * 2018年4月13日11:26:30
 * 装饰器
 */
class Decorator
{
    /**
     *确保执行顺序无误
     * @var  $ensure
     */
    private static $ensure=false;
    /**
     *保存对象
     * @var type objcet
     */
    private static $objcet=[];
    /**
     * 添加装饰器
     * @param \app\index\controller\decorator\Decoratorinterface $objcet
     */
    static public function setobjcet(Decoratorinterface $objcet){
        self::$objcet[]=$objcet;
    }
    /**
     * 先执行的
     */
    static public function before(){
        if(empty(self::$objcet)){
            return FALSE;
        }
        self::$ensure=true;
        Db::startTrans();#开启事物
        foreach(self::$objcet as $obj){
            $obj ->before();
        }
    }

    /**
     * 后执行的
     * @param bool $bool
     * @return boolean
     */
    static public function after(bool $bool=true){
        if(self::$ensure == false){
            return FALSE;
        }
        if($bool == FALSE){
            Db::rollback();
            return FALSE;
        }
        foreach(self::$objcet as $obj){
            if($obj->after() == false){
                $bool =FALSE;
                break;
            }
        }
        if($bool){
            Db::commit();
            return true;
        }else{
            Db::rollback();
            return false;
        }
    }

    static public function __callStatic($name,$arguments) {
        echo "$name 不存在";
    }
}
 